using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public ProdutoVO getProduto(int? idProduto, string produto)
		{
			ProdutoVO produtoVO = null;
			List<ProdutoVO> listProdutoVOs = getProdutos(idProduto, produto);
			if (listProdutoVOs != null && listProdutoVOs.Count > 0)
			{
				produtoVO = listProdutoVOs[0];
			}
			return produtoVO;
		}

		public ProdutoVO getProduto(int? idProduto)
		{
			return getProduto(idProduto, null);
		}

		public List<ProdutoVO> getProdutos()
		{
			return getProdutos(null, null);
		}

		public List<ProdutoVO> getProdutos(int? idProduto)
		{
			return getProdutos(idProduto, null);
		}

		public List<ProdutoVO> getProdutos(int? idProduto, string produto)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT prd.idProduto as prd_idProduto, prd.produto as prd_produto, prd.cadastro as prd_cadastro, prd.cadastradoPor as prd_cadastradoPor, prd.edicao as prd_edicao, prd.editadoPor as prd_editadoPor  ");
			query.AppendLine("FROM produto as prd ");
			if (idProduto != null)
			{
				query.AppendLine(where + "prd.idProduto=@idProduto ");
				where = "AND ";
			}
			if (produto != null)
			{
				query.AppendLine(where + "prd.produto LIKE @produto ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY prd.produto ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idProduto!= null) cmd.Parameters.Add(getParameter(cmd, "@idProduto", idProduto));
			if (produto!= null) cmd.Parameters.Add(getParameter(cmd, "@produto", "%"+produto+"%"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<ProdutoVO> listProduto = new List<ProdutoVO>();

				while (reader.Read())
				{
					ProdutoVO produtoVO = ProdutoVO.CreateVO();
					produtoVO.idProduto = reader.GetInt32(reader.GetOrdinal("prd_idProduto"));
					produtoVO.produto = reader.GetString(reader.GetOrdinal("prd_produto"));
					produtoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("prd_cadastro"));
					produtoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("prd_cadastradoPor"));
					produtoVO.edicao = reader.GetDateTime(reader.GetOrdinal("prd_edicao"));
					produtoVO.editadoPor = reader.GetString(reader.GetOrdinal("prd_editadoPor"));


					listProduto.Add(produtoVO);
				}
				reader.Close();
				return listProduto;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setProduto(ProdutoVO produtoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE produto ");
			query.AppendLine("SET produto=@produto,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idProduto=@idProduto ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idProduto", produtoVO.idProduto));
			cmd.Parameters.Add(getParameter(cmd, "@produto", produtoVO.produto));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", produtoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", produtoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", produtoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", produtoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newProduto(ProdutoVO produtoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO produto ");
			query.AppendLine("  ( produto, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @produto, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@produto", produtoVO.produto));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", produtoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", produtoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", produtoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", produtoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('produto') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delProduto(ProdutoVO produtoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM produto ");
			query.AppendLine("WHERE idProduto=@idProduto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idProduto", produtoVO.idProduto));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
	}
}
